<?php
namespace app\factory\wxPay;
use think\facade\Config;
use app\libs\Util;
/**
 * 微信退款
 * Class WxOut
 * @package app\factory\wxPay
 */
class WxOut
{   
	//小程序支付
	private $appid="";//小程序appID
	private $mch_id="";//商户号
	private $nonce_str;//随机字符串最高32位
	private $out_trade_no;//订单号
	private $out_refund_no;//退款单号
	private $total_fee;//订单金额
	private $refund_fee;//退款金额
	private $notify_url="";//回调地址
	private $sign;//签名
	private $key="";//秘钥
	
	//构造
    public function __construct()
    {	
    	$this->appid=Config::get('system.wx_pay.app_id');//小程序id
    	$this->mch_id=Config::get('system.wx_pay.mch_id');//获取小程序mch_id
    	$this->key=Config::get('system.wx_pay.key');//获取小程序key
    	$this->notify_url=Config::get('system.wx_pay.notify_url_refund');//获取小程序回调地址
    }

	/**
	* 微信退款
	* @param $data[out_refund_no]商户退款单号	
	* @param $data[out_trade_no]商户订单号
	* @param $data[refund_fee]退款金额 单位分
	* @param $data[total_fee]订单金额 单位分
	*/
	public function confirm($data=[]){
		$this->nonce_str=md5(time());//生成随机字符串
		$this->out_refund_no=$data['out_refund_no'];
		$this->out_trade_no=$data['out_trade_no'];
		$this->refund_fee=intval(floatval($data['refund_fee'])*100);
		$this->total_fee=intval(floatval($data['total_fee'])*100);

		//ASCII排序
		$strA="";
		$strA.="appid=".$this->appid;
		$strA.="&mch_id=".$this->mch_id;
		$strA.="&nonce_str=".$this->nonce_str;
		$strA.="&notify_url=".$this->notify_url;
		$strA.="&out_refund_no=".$this->out_refund_no;
		$strA.="&out_trade_no=".$this->out_trade_no;
		$strA.="&refund_fee=".$this->refund_fee;
		$strA.="&total_fee=".$this->total_fee;
		$strA.="&key=".$this->key;
		$this->sign=strtoupper(md5($strA));//转大写

		//xml数据
		$xml="";
		$xml.="<xml>";
		$xml.="<appid>".$this->appid."</appid>";
		$xml.="<mch_id>".$this->mch_id."</mch_id>";
		$xml.="<nonce_str>".$this->nonce_str."</nonce_str>";
		$xml.="<notify_url>".$this->notify_url."</notify_url>";
		$xml.="<out_refund_no>".$this->out_refund_no."</out_refund_no>";
		$xml.="<out_trade_no>".$this->out_trade_no."</out_trade_no>";
		$xml.="<refund_fee>".$this->refund_fee."</refund_fee>";
		$xml.="<total_fee>".$this->total_fee."</total_fee>";
		$xml.="<sign>".$this->sign."</sign>";
		$xml.="</xml>";
		$url="https://api.mch.weixin.qq.com/secapi/pay/refund";//访问微信退款
		$wxpay=Util::post_request_ssl($url,$xml);//访问数据
		$wxpay = json_decode(json_encode( simplexml_load_string($wxpay, 'SimpleXMLElement', LIBXML_NOCDATA) ), true);
		return $wxpay;
	}

}